package com.tsj.model.utils;

import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.poifs.filesystem.Ole10Native;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import java.io.*;
import java.util.List;
import java.util.Random;

/**
 * @author taoshujian
 * @version 1.0
 * @since 2025-10-24 16:15:17
 */
public class ExcelUtil {

    public static void main(String[] args) throws IOException {
        String url = "D://1.xlsx";
        String outputDir = "D://";
        FileInputStream file = new FileInputStream(new File(url));
        readExcel(file,outputDir);


//        Workbook workbook = new XSSFWorkbook(new FileInputStream(new File(url)));
//        for(int i = 0; i < workbook.getAllPictures().size(); i++){
//            PictureData picture = workbook.getAllPictures().get(i);
//            String format = getFormatFromMimeType(picture.getMimeType());
//            System.out.println("图片格式：" + format);
//            saveToFile(picture.getData(), outputDir, i+".jpg");
//        }



//        try {
//            XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(url));
//            // 获取 Excel 中所有嵌入的资源（包括各种对象）
//            List<PackagePart> embeddedParts = workbook.getAllEmbeddedParts();
//
//            for (PackagePart part : embeddedParts) {
//                // 获取嵌入对象的文件名（可能包含扩展名）
//                String fileName = part.getPartName().getName();
//                // 判断是否为 PDF 文件（通过文件名后缀筛选）
//                if (!fileName.toLowerCase().endsWith(".pdf")) {
//                    // 生成保存的 PDF 文件名（避免重复）
//                    String pdfFileName = outputDir + System.currentTimeMillis() + "_.pdf";
//
//                    // 读取嵌入对象的字节流并保存为 PDF
//                    try{
//                        InputStream is = part.getInputStream();
//
//                        // 关键：验证PDF文件头（必须以%PDF-开头）
//                        byte[] header = new byte[5];
//                        int read = is.read(header);
//                        if (read < 5 || !new String(header).startsWith("%PDF-")) {
//                            System.err.println("非PDF文件：" + fileName);
//                            // continue; // 非PDF文件，跳过
//                        }
//
//                        // 重置流指针到起始位置（因为上面读取了5字节）
//                        if (is.markSupported()) {
//                            is.reset();
//                        } else {
//                            // 若流不支持重置，重新获取输入流
//                            is.close();
//                            is = part.getInputStream();
//                        }
//
//                        try (OutputStream os1 = new FileOutputStream(fileName)) {
//                            byte[] buffer = new byte[8192];
//                            int len;
//                            while ((len = is.read(buffer)) != -1) {
//                                os1.write(buffer, 0, len);
//                            }
//                            System.out.println("保存成功：" + fileName);
//                        }
//
//                        System.out.println("PDF 保存成功：" + pdfFileName);
//                    } catch (IOException e) {
//                        System.err.println("保存 PDF 失败：" + e.getMessage());
//                    }
//                }
//            }
//
//        } catch (IOException e) {
//            e.printStackTrace();
//        } catch (OpenXML4JException e) {
//            throw new RuntimeException(e);
//        }
    }

    public static void readExcel(InputStream is,String outputDir) {
        try {
            Workbook workbook = new XSSFWorkbook(is);
            XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0);




            XSSFDrawing drawing = sheet.getDrawingPatriarch();

            if (drawing == null) {
                System.out.println("文件内没有附件！");
                return;
            }

            // 遍历所有形状，寻找图片形状并关联图片数据
            for (XSSFShape shape : drawing.getShapes()) {
                // 判断是否为图片形状（通过是否包含图片索引）
               if (shape instanceof XSSFPicture) {
                    XSSFPicture picture = (XSSFPicture) shape;

                    XSSFPictureData picData = picture.getPictureData(); // 直接获取图片数据（无需索引）
                    if (picData == null) {
                        continue; // 过滤无效图片
                    }

                    // 获取图片格式
                    String mimeType = picData.getMimeType();
                    String format = ExcelTools.getFormatFromMimeType(mimeType);

                    // 获取图片所在单元格
                    XSSFClientAnchor anchor = picture.getClientAnchor();
                    String cellAddress = ExcelTools.getCellAddress(anchor.getRow1(), anchor.getCol1());

                    System.out.println("读取到图片：mimeType=" + mimeType +" format="+format+"  name= xy="+cellAddress);
                   ExcelTools.saveToFile(picData.getData(), outputDir, cellAddress+"."+format);
                }else if (shape instanceof XSSFObjectData) {
                    XSSFObjectData objectData = (XSSFObjectData) shape;
                    String fileName = objectData.getFileName();

                    XSSFAnchor anchor = shape.getAnchor();
                    XSSFClientAnchor clientAnchor = (XSSFClientAnchor) anchor;
                    String cellAddress = ExcelTools.getCellAddressByAnchor(clientAnchor);
                    byte[] content = objectData.getObjectData();

                    InputStream inputStream = new ByteArrayInputStream(content);
                    POIFSFileSystem fs = new POIFSFileSystem(inputStream);
                    Ole10Native nativeObject = Ole10Native.createFromEmbeddedOleObject( fs);


                    System.out.println("读取到PDF：fileName=" + fileName +" ContentType="+objectData.getContentType()+"  name="+ nativeObject.getLabel2() +" xy="+cellAddress);
                    ExcelTools.saveToFile(nativeObject.getDataBuffer(), outputDir, nativeObject.getLabel2());


                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 识别文件类型（通过文件头判断）
    private static String identifyFileType(InputStream is) throws IOException {
        // 读取文件头字节用于判断类型
        byte[] header = new byte[8];
        is.mark(8); // 标记当前位置，方便后续重置
        int read = is.read(header);
        is.reset(); // 重置流指针，避免数据丢失

        if (read < 4) return "unknown";

        // PDF文件头：%PDF-
        if (new String(header, 0, 4).equals("%PDF")) {
            return "extracted.pdf";
        }
        // Word文件头（.docx是zip格式，这里以旧版.doc为例）
        else if (header[0] == (byte)0xD0 && header[1] == (byte)0xCF
                && header[2] == (byte)0x11 && header[3] == (byte)0xE0) {
            return "extracted.doc";
        }
        // 其他类型可继续添加（如Excel、图片等）
        else {
            return "unknown.bin";
        }
    }







}
